package com.ruoyi.common.utils.biz;

import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description TODO
 * @Author liuhl
 * @Date 2024/4/25
 **/
@Slf4j
public class CommonUtil {


    /**
     *@Description  输入经度范围(-100,100或者 100 ) 和 纬度范围(-50,50或者 50 )，获取  区域的左上和右下点坐标
     *@Author liuhl
     *@date 2024/4/24
     */
    public static String getArea(String longitudeRange,String latitudeRange){
        String[] lonRange = longitudeRange.split(",");
        String[] latRange = latitudeRange.split(",");
        //分情况
        //1.[-10] [10] , 这种就返回两个固定的点例如[[-10,10],[-10,10]]
        if (lonRange.length < 2 && latRange.length < 2){
            String lonMin = lonRange[0];
            String lonMax = lonRange[0];
            String latMin = latRange[0];
            String latMax = latRange[0];
            String leftPoint = "[["+ lonMin + "," + latMax + "],";
            String rightPoint = "["+ lonMax + "," + latMin + "]]";
            String points = leftPoint + rightPoint;
            return points;
        }

        if (lonRange.length < 2){
            String lonMin = lonRange[0];
            String lonMax = lonRange[0];
            String latMin = latRange[0];
            String latMax = latRange[1];
            //左上的点是：经度最小，纬度最大；右下的点是：经度最大，纬度最小
            String leftPoint = "[["+ lonMin + "," + latMax + "],";
            String rightPoint = "["+ lonMax + "," + latMin + "]]";
            String points = leftPoint + rightPoint;
            return points;  //2个点确定一个区域
        }

        if (latRange.length < 2){
            String lonMin = lonRange[0];
            String lonMax = lonRange[1];
            String latMin = latRange[0];
            String latMax = latRange[0];
            //左上的点是：经度最小，纬度最大；右下的点是：经度最大，纬度最小
            String leftPoint = "[["+ lonMin + "," + latMax + "],";
            String rightPoint = "["+ lonMax + "," + latMin + "]]";
            String points = leftPoint + rightPoint;
            return points;  //2个点确定一个区域
        }

        String lonMin = lonRange[0];
        String lonMax = lonRange[1];

        String latMin = latRange[0];
        String latMax = latRange[1];

        //左上的点是：经度最小，纬度最大；右下的点是：经度最大，纬度最小
        String leftPoint = "[["+ lonMin + "," + latMax + "],";
        String rightPoint = "["+ lonMax + "," + latMin + "]]";
        String points = leftPoint + rightPoint;
        return points;  //2个点确定一个区域
    }

    /**
     *@Description 在指定dir下，筛选包含 contains 字符串的所有目录 list。
     *@Author liuhl
     *@date 2024/4/28
     */
    public static List<File> findSpecNameDirs(String dir,String contains){
        log.debug("dir: {}, contains: {}", dir, contains);
        File file = new File(dir);
        if (file == null || !file.exists() || file.isFile()){
            return new ArrayList<>();
        }
        File[] files = file.listFiles();
        List<File> sortedFiles = Arrays.asList(files)
                .stream()
                .filter(File::isDirectory)
                .filter(o -> o.getName() != null && o.getName().contains(contains))
                .collect(Collectors.toList());
        return sortedFiles;
    }

    /**
     *@Description 在指定dir下，筛选包含 contains 字符串的所有文件 list。
     *@Author liuhl
     *@date 2024/4/28
     */
    public static List<File> findSpecNameFiles(String dir,String contains){
        log.debug("dir: {}, contains: {}", dir, contains);
        File file = new File(dir);
        if (file == null || !file.exists() || file.isFile()){
            return new ArrayList<>();
        }
        File[] files = file.listFiles();
        List<File> sortedFiles = Arrays.asList(files)
                .stream()
                .filter(File::isFile)
                .filter(o -> o.getName() != null && o.getName().contains(contains))
                .collect(Collectors.toList());
        return sortedFiles;
    }


    /**
     * 指定开头获取数据
     * 返回值是数据的字符串列表 需要自行遍历分割
     *
     * @param file      文件
     * @param startLine 开始行 (文档行号 非索引)
     * @param encoding  字符编码
     * @return {@link List}<{@link String}>
     */
    public static List<String> readLineDataByStart(File file, Integer startLine, String encoding) {
        if (startLine <= 0) {
            throw new IndexOutOfBoundsException("开始行号不能小于1");
        }
        if (StrUtil.isBlank(encoding)){
            encoding = "UTF-8";
        }
        FileReader fileReader = new FileReader(file, encoding);
        List<String> data = new ArrayList<>();
        fileReader.readLines(data);
        return data.subList(startLine - 1, data.size());
    }

    /**
     * 指定开头获取数据
     * 返回值是已分割后的数据 (仅适用使用多个空格作为分隔符的情况)
     *
     * @param path      文件路径
     * @param startLine 开始行 (文档行号 非索引)
     * @param encoding  字符编码
     * @return {@link List}<{@link String}>
     */
    public static List<String[]> readDataByStart(String path, Integer startLine, String encoding) {
        if (startLine <= 0) {
            throw new IndexOutOfBoundsException("开始行号不能小于1");
        }
        if (StrUtil.isBlank(encoding)){
            encoding = "UTF-8";
        }
        FileReader fileReader = new FileReader(new File(path), encoding);
        List<String> data = new ArrayList<>();
        fileReader.readLines(data);
        List<String> dataList = data.subList(startLine - 1, data.size());
        String delimiter = "  +"; //至少两个空格
        return dataList.stream().map(line -> {
            return line.split(delimiter);
        }).collect(Collectors.toList());
    }


    /**
     * 返回值是数据的字符串
     * @param file      文件
     * @param encoding  字符编码
     * @return {@link List}<{@link String}>
     */
    public static String readStrData(File file, String encoding) {
        if (StrUtil.isBlank(encoding)){
            encoding = "UTF-8";
        }
        FileReader fileReader = new FileReader(file, encoding);
        List<String> data = new ArrayList<>();
        String content = fileReader.readString();
        if (StrUtil.isBlank(content)){
            return "";
        }
        return content.trim();
    }

    /**
     *@Description 数值相减（包括科学计数法的数值）
     *@Author liuhl
     *@date 2024/4/30
     */
    public static String scientificSubtract(String a,String b){
        BigDecimal big1 = new BigDecimal(a);
        BigDecimal big2 = new BigDecimal(b);
        BigDecimal subtract = big1.subtract(big2);
        subtract.setScale(2, RoundingMode.DOWN);
        return subtract.toString();
    }

    public static String doubleToScientific(double input){
        //log.info("doubleToScientific: input={}", String.valueOf(input));
        if (Double.isInfinite(input) || Double.isNaN(input)){
            return "0";
        }
        //1.double转字符串截取到合适的位数
        String doubleStr = String.valueOf(input);

        if (doubleStr.contains("e") || doubleStr.contains("E")){
            return doubleStr;
        }

        if (doubleStr.length() >=7){
            doubleStr = doubleStr.substring(0,7);
        }

        //2.转回double 保留4位有效数字
        Double num = Double.valueOf(doubleStr);
        if (num == 0){
            return "0";
        }
        return NumberUtil.decimalFormat("#.####E0", num);
    }




}
